package com.jade.journal.desc.field.types;

import java.nio.charset.Charset;

import com.jade.framework.base.text.Escaper;
import com.jade.framework.base.text.SimpleEscaper;

/**
 * 字符串类型
 *
 * @author fengyun
 * @version Jan 10, 2003 12:51:23 PM
 */
public class StringType extends AbstractType
{

    /** 默认Escaper */
    private Escaper escaper = SimpleEscaper.getInstance();

    private static StringType instance = new StringType();

    /** 构造 */
    private StringType()
    {
        super("String");
    }

    /** 返回实例 */
    public static StringType getInstance()
    {
        return instance;
    }

    /** 构造 */
    protected StringType(String name)
    {
        super(name);
    }

    /**
     * 将指定的数据转换成对象
     *
     * @param data 字节数组
     * @param off  起始位置
     * @param len  长度
     * @return 返回对象
     */
    public Object getObject(byte[] data, int off, int len)
    {
        return getString(data, off, len);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data 字节数组
     * @param off  起始位置
     * @param len  长度
     * @return 返回字符串
     */
    public String getString(byte[] data, int off, int len)
    {
        return getString(data, off, len, escaper);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data 字节数组
     * @param off  起始位置
     * @param len  长度
     * @param enc  字符集
     * @return 返回字符串
     */
    public String getString(byte[] data, int off, int len, String enc)
    {
        return getString(data, off, len, enc, escaper);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data    字节数组
     * @param escaper 忽略
     * @return 数据转换成字符串
     */
    public String getString(byte[] data, Escaper escaper)
    {
        return getString(data, 0, data.length, escaper);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data    字节数组
     * @param off     起始位置
     * @param len     长度
     * @param escaper 忽略
     * @return 数据转换成字符串
     */
    public String getString(byte[] data, int off, int len, Escaper escaper)
    {
        return getString(data, off, len, Charset.defaultCharset().name(), escaper);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data    字节数组
     * @param off     起始位置
     * @param len     长度
     * @param enc     字符集
     * @param escaper 忽略
     * @return 数据转换成字符串
     */
    public String getString(byte[] data, int off, int len, String enc, Escaper escaper)
    {
        return escaper.unescape(data, off, len, enc);
    }

    /**
     * 将指定的数据转换成对象
     *
     * @param data 字符数组
     * @param off  起始位置
     * @param len  长度
     * @return 返回对象
     */
    public Object getObject(char[] data, int off, int len)
    {
        return getString(data, off, len);
    }

    /**
     * 指定数据转换成字符串
     *
     * @param data 字节数组
     * @param off  起始位置
     * @param len  长度
     * @return 返回字符串
     */
    public String getString(char[] data, int off, int len)
    {
        return escaper.unescape(data, off, len);
    }
}
